package ar.edu.utn.frgp.banco.business.Implements;

import java.util.Date;

import ar.edu.utn.frgp.banco.business.Interfaces.IntPlazosFijosBusiness;
import ar.edu.utn.frgp.banco.dao.Implements.ImpMovimientos;
import ar.edu.utn.frgp.banco.dao.Implements.ImpPlazoFijo;
import ar.edu.utn.frgp.banco.dao.Implements.ImpClientes;
import ar.edu.utn.frgp.banco.dao.Implements.ImpCuenta;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimiento;
import ar.edu.utn.frgp.banco.domain.PlazoFijo;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class ImpPlazosFijosBusiness implements IntPlazosFijosBusiness {

	@Override
	public boolean CrearPLazoFijo(Integer id_cliente, Integer id_cuenta_origen,
			Integer nro_cuenta_destino, Double monto, Integer Dias)
			throws Exception {
		try {
			PlazoFijo plazofijo = new PlazoFijo();
			ImpPlazoFijo plazofijodao = new ImpPlazoFijo();

			// Valido Cliente
			Cliente cliente = new Cliente();
			ImpClientes clientedao = new ImpClientes();
			cliente = clientedao.ObtenerCliente(id_cliente);
			if (cliente == null) {
				throw new Exception("El cliente es inexsistente.");
			}

			// Valido cuenta si el origen es "CUENTA"
			ImpCuenta cuentadao = new ImpCuenta();
			Cuenta cuentaorigen = null;

			if (id_cuenta_origen > 0) {
				cuentaorigen = cuentadao.TraerCuenta(id_cuenta_origen);
				// Valido Existencia
				if (cuentaorigen != null) {
					// Valido la relacion con el cliente
					if (cuentaorigen.getID_Cliente() != id_cliente) {
						throw new Exception(
								"La cuenta de origen no corresponde al cliente seleccionado");
					}
					// Valido el monto saldo disponible de la cuenta de origen

					double montototal = monto;
					double disponiblecuenta = 0;
					disponiblecuenta = cuentaorigen.getSaldo()
							+ cuentaorigen.getDescubierto();
					if (cuentaorigen.getTipoCuenta().equals(
							Cuenta.TIPOCUENTA_CUENTACORRIENTE)) {
						montototal = (monto * 1.06);
					}
					if (disponiblecuenta < montototal) {
						throw new Exception(
								"El disponible de lacuenta de origen es menor  al monto del plazo fijo");
					}
				} else {
					throw new Exception("La cuenta de origen es inexistente");
				}
			}

			// Valido Cuenta de Destino
			Cuenta cuentadestino = null;

			if (nro_cuenta_destino > 0) {
				cuentadestino = cuentadao.TraerCuentaPorNro(nro_cuenta_destino);
				// Valido Existencia
				if (cuentadestino != null) {
					// Valido la relacion con el cliente
					if (cuentadestino.getID_Cliente() != id_cliente) {
						throw new Exception(
								"La cuenta de origen no corresponde al cliente seleccionado");
					}
				} else {
					throw new Exception("La cuenta de origen es inexistente");
				}
			}

			// Doy de alta el plazo fijo

			// Agrego registro en Plazo Fijo
			if (nro_cuenta_destino > 0) {
				plazofijo.setAcreditacion(PlazoFijo.ACREDITACIONPLAZOFIJO_CUENTA);
				plazofijo.setId_cuentaDestino(cuentadestino.getID_Cuenta());
			} else {
				plazofijo.setAcreditacion(PlazoFijo.ACREDITACIONPLAZOFIJO_CAJA);
				plazofijo.setId_cuentaDestino(0);
			}

			plazofijo.setFechaAlta(new Date());
			plazofijo.setId_cliente(id_cliente);

			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.DATE, Dias);
			Date fecha = cal.getTime();
			plazofijo.setFechaVenc(fecha);

			plazofijo.setId_cuentaOrigen(id_cuenta_origen);
			switch (Dias) {
			case 30:
				plazofijo.setInteres(10);
				break;
			case 60:
				plazofijo.setInteres(12);
				break;
			case 90:
				plazofijo.setInteres(13);
				break;
			}
			plazofijo.setMonto(monto);

			if (id_cuenta_origen > 0) {
				plazofijo.setOrigen(PlazoFijo.ORIGENPLAZOFIJO_CUENTA);
			} else {
				plazofijo.setOrigen(PlazoFijo.ORIGENPLAZOFIJO_EFECTIVO);
			}

			plazofijodao.AltaPLazoFijo(plazofijo);

			if (id_cuenta_origen > 0) {
				// Nuevo registro en tabla Movimientos (para debito)
				Movimiento movimientodebito = new Movimiento();
				ImpMovimientos movimientosdao = new ImpMovimientos();

				movimientodebito.setFecha(new Date());
				movimientodebito.setId_cuenta(cuentaorigen.getID_Cuenta());
				movimientodebito.setOrigen(Movimiento.ORIGEN_PLAZOFIJO);
				Double montototal;

				if (cuentaorigen.getTipoCuenta().equals(
						Cuenta.TIPOCUENTA_CAJAAHORRO)) {
					montototal = monto;
				} else {// si es Cuenta Corriente le sumo el 0.06% de interes
						// por el movimiento
					montototal = monto * 1.06;
				}
				movimientodebito.setMonto(montototal);
				movimientodebito.setSaldoActual(cuentaorigen.getSaldo()
						- montototal);
				movimientodebito
						.setTipoMov(Movimiento.TIPOMOVIMIENTO_EXTRACCION);
				movimientosdao.AltaMovimiento(movimientodebito);

				// Modifico el saldo de la cuenta Origen
				cuentaorigen.setSaldo(cuentaorigen.getSaldo() - montototal);
				cuentadao.ModiCuenta(cuentaorigen);
			}
			return true;
		} catch (Exception e){
			throw new Exception(e.getMessage()); //ENVIO DE ECEPCIONES
		}
	}
}
